%% 
clear,clc;

testUnitStepFilter = 0;
testGaussianFilter1D = 0;
testSgolayfilt = 0;
testWaveletFilt = 1;

testDWT = 0;

%% testDWT
if testDWT == 1
        % 示例信号：正弦信号 + 随机噪声
        t = linspace(0, 1, 1024); % 时间向量
        x = sin(2 * pi * 50 * t) + 0.5 * randn(size(t)); % 50 Hz 的正弦信号 + 随机噪声

        % DWT 分解
        waveletName = 'haar'; % 使用 Haar 小波
        level = 2; % 分解级别
        [coeffs, lengths] = wavedec(x, level, waveletName); % 获取小波系数和各部分长度

        % 提取近似系数（低频）和细节系数（高频）
        approximation = appcoef(coeffs, lengths, waveletName, level); % 提取近似系数
        details = detcoef(coeffs, lengths, level); % 提取细节系数

        % 滤波过程：对细节系数进行阈值处理
        threshold = 0.1; % 阈值
        details_filtered = cell(1, level); % 初始化过滤后的细节系数
        for i = 1:level
            details_filtered{i} = wthcoef('d', coeffs, lengths, i, threshold); % 使用阈值进行小波系数去噪
        end

        % 重构信号
        coeffs_filtered = [approximation, details_filtered{1}, details_filtered{2}]; % 合并近似系数和过滤后的细节系数
        x_reconstructed = waverec(coeffs_filtered, lengths, waveletName); % 使用滤波后的系数重构信号

        % 绘制结果
        figure;
        subplot(4, 1, 1);
        plot(t, x);
        title('原始信号');
        xlabel('时间');
        ylabel('幅度');
        % 
        % subplot(4, 1, 2);
        % plot(t, approximation); % 低频成分（近似系数）
        % title('低频成分（近似系数）');
        % xlabel('时间');
        % ylabel('幅度');
        % 
        % subplot(4, 1, 3);
        % plot(t, details_filtered{1}); % 高频成分（细节系数）经过滤波
        % title('高频成分（细节系数）经滤波');
        % xlabel('时间');
        % ylabel('幅度');

        subplot(4, 1, 4);
        plot(t, x_reconstructed); % 重构信号（去噪后的信号）
        title('重构信号（去噪后的信号）');
        xlabel('时间');
        ylabel('幅度');
end

%% testWaveletFilt

if testWaveletFilt == 1
%         t = linspace(0, 1, 1024); % 时间向量
%         x = sin(2 * pi * 50 * t) + 0.5 * randn(size(t)); % 50 Hz 的正弦信号 + 随机噪声
        
        % 创建一个示例输入数组（包含噪声的正弦波）
        t = linspace(0, 10, 100); % 时间数组
        x = sin(t) + 0.5 * randn(1, length(t)); % 输入数组（正弦波 + 随机噪声）
        

        % 调用小波滤波函数
        waveletName = 'haar'; % 使用 Haar 小波
        level = 2; % 分解级别
        threshold = 0.1; % 阈值
        x_filtered = waveletFilt(x, waveletName, level, threshold); % 进行滤波

        % 绘制原始信号和重构信号的对比
        figure;
        plot(t, x, 'b', 'DisplayName', '原始信号');
        hold on;
        plot(t, x_filtered, 'r', 'DisplayName', '重构信号');
        legend;
        title('原始信号与重构信号对比');
        xlabel('时间');
        ylabel('幅度');
end


%% testSgolayfilt
if testSgolayfilt == 1
        % 生成含噪声的正弦信号
        t = linspace(0, 2*pi, 100);
        y = sin(t) + 0.1 * randn(size(t));

        % 定义窗口大小和多项式阶数
        windowLength = 11; % 窗口大小，必须为奇数
        polyOrder = 3;     % 多项式阶数
        % 使用 Savitzky-Golay 滤波器
        ySmooth = sgolayfilt(y, polyOrder, windowLength);

        % 绘制结果
        figure;
        plot(t, y, 'b', 'DisplayName', '原始信号');
        hold on;
        plot(t, ySmooth, 'r', 'DisplayName', '滤波后信号');
        legend;
        title('Savitzky-Golay 滤波器效果');
        xlabel('时间');
        ylabel('幅度');
end

%% testUnitStepFilter
 
if testUnitStepFilter == 1

        % 创建一个示例输入数组（包含噪声的正弦波）
        t = linspace(0, 10, 100); % 时间数组
        x = sin(t) + 0.5 * randn(1, length(t)); % 输入数组（正弦波 + 随机噪声）

        % 设置滤波器窗口大小
        Z = 5;

        % 调用单位阶跃滤波器函数
        y = unitStepFilter(x, Z);

        % 绘制原始信号和滤波后的信号
        figure;
        plot(t, x, 'b', 'DisplayName', '原始信号');
        hold on;
        plot(t, y, 'r', 'DisplayName', '滤波后信号');
        legend;
        title('单位阶跃滤波器效果');
        xlabel('时间');
        ylabel('幅度');

end




%% testGaussianFilter1D

if testGaussianFilter1D == 1

        % 创建一个示例输入数组（包含噪声的正弦波）
        t = linspace(0, 10, 100); % 时间数组
        x = sin(t) + 0.5 * randn(1, length(t)); % 输入数组（正弦波 + 随机噪声）

        % 设置高斯核的标准差
        sigma = 2;

        % 调用 1D 高斯滤波器函数
        y = gaussianFilter1D(x, sigma);

        % 绘制原始信号和滤波后的信号
        figure;
        plot(t, x, 'b', 'DisplayName', '原始信号');
        hold on;
        plot(t, y, 'r', 'DisplayName', '滤波后信号');
        legend;
        title('1D 高斯核滤波器效果');
        xlabel('时间');
        ylabel('幅度');

end


%% 